home *** CD-ROM | disk | FTP | other *** search
/ EnigmA Amiga Run 1998 October / EnigmA AMIGA RUN 31 (1998)(G.R. Edizioni)(IT)[!][issue 1998-10].iso / linux / ppmtoagafb-0.7 / agaview.py next >
Text File  |  1998-09-22  |  7KB  |  205 lines

  1. #!/usr/local/bin/python
  2. #
  3. # AgaView.py 0.4 - Oct 9 1996
  4. #
  5. #   Views `any' picture using Geert Uytterhoeven's ppmtoagafb tool
  6. #   This version requires my stdin-enhanced version
  7. #
  8. #   Chris Lawrence <quango@socomm.net>
  9. #
  10. # . No filter is used for PPM and PGM images (duh)
  11. # . 'djpeg' is used for JFIF images
  12. # . You can use 'pngtopnm' if you've compiled it for PNG images
  13. # . NetPBM utils are used for GIF and ILBM images
  14. # . 'convert' (from ImageMagick) is used for everything else
  15. #
  16. # To use this, you must have the NetPBM package.
  17. # To view JFIF images, you'll need 'djpeg' from the Independent JPEG Group
  18. # To view PNG images, you'll need 'pngtoppm' from the PNG developers
  19. # To view odd image formats, you'll need 'convert' from the ImageMagick
  20. #   or you'll need to change identify_file to identify them and convert_file
  21. #   to convert them to pgm or ppm.
  22. #
  23. # Changes since third release: (Sep 26)
  24. # . Using file extensions in identify_file (if there's an extension,
  25. #     assume it is valid)
  26. #
  27. # Changes since second release: (Sep 21)
  28. # . Using new stdin pipe in ppmtoagafb for better throughput
  29. # . Doesn't scale if the image will fit on the display without scaling
  30. #
  31. # Changes since first release: (Sep 16)
  32. # . Added automagic scaling of image (via pnmscale)
  33. #   Set WIDTH and HEIGHT equal to the size of your default console
  34. # . Fixed filtering for PPM/PGM images
  35. # . Added filter for pbm->pgm
  36.  
  37. DEBUG     = 0 # Set to 1 for informative messages
  38. NOCLEANUP = 0 # Set to 1 to keep the generated files around
  39.  
  40. WIDTH   = 640 # Width of fb0current
  41. HEIGHT  = 480 # Height of fb0current
  42.  
  43. OPTIONS = '--delay 10 --center' # Supply any options to ppmtoagafb here
  44.  
  45. JPEG_OPTS = '-pnm' # Any options to djpeg go here
  46.                    # '-fast' might be nice here for faster previews
  47.  
  48. import sys, os, regex, time, string
  49.  
  50. def debug_message(msg):
  51.         if DEBUG:
  52.                 print msg
  53.  
  54. def identify_file(filename):
  55.         fields = string.splitfields(filename,'.')
  56.         if len(fields) >= 2: 
  57.                 # Our filename has at least one extension
  58.                 ext = fields[-1]
  59.                 
  60.                 debug_message('Using extension '+ext+' for identity.')
  61.  
  62.                 if ext == 'jpg' or ext == 'jpeg':
  63.                         return 'JFIF'
  64.                 elif ext == 'ilbm' or ext == 'lbm' or ext == 'iff':
  65.                         return 'ILBM'
  66.                 elif ext:
  67.                         return string.upper(ext)
  68.  
  69.         fd = os.popen('file %s' % filename)
  70.         typestring = fd.readline()
  71.         fd.close()
  72.  
  73.         typestring = string.strip(typestring)
  74.         debug_message(typestring)
  75.  
  76.         if regex.search('.*JFIF.*', typestring) != -1:
  77.                 return 'JFIF'
  78.         elif regex.search('.*PPM.*', typestring) != -1:
  79.                 return 'PPM'
  80.         elif regex.search('.*PGM.*', typestring) != -1:
  81.                 return 'PGM'
  82.         elif regex.search('.*PBM.*', typestring) != -1:
  83.                 return 'PBM'
  84.         elif regex.search('.*PNG.*', typestring) != -1:
  85.                 return 'PNG'
  86.         elif regex.search('.*GIF.*', typestring) != -1:
  87.                 return 'GIF'
  88.         elif regex.search('.*ILBM.*', typestring) != -1:
  89.                 return 'ILBM'
  90.  
  91.         # The rest of these, we run 'convert' on so don't bother
  92.         # identifying them
  93.  
  94.         return 'Unidentified'
  95.  
  96. def convert_file(filename):
  97.         type = identify_file(filename)
  98.         debug_message('Detected type: '+type)
  99.  
  100.         if type == 'PPM' or type == 'PGM' or type == 'PBM':
  101.                 return ''
  102.         
  103.         # The extension tells convert to create a PPM file
  104.         # NB: Python does have a tempfile module, but it doesn't guarantee
  105.         #     any extension.
  106.         tmpnam = '/tmp/agaview.%d.%d.ppm' % (time.time(), os.getpid())
  107.         
  108.         if type == 'JFIF':
  109.                 os.system('djpeg %s %s > %s' %
  110.                           (JPEG_OPTS, filename, tmpnam))
  111.         elif type == 'PNG':
  112.                 os.system('pngtopnm %s > %s' % (filename, tmpnam) )
  113.         elif type == 'GIF':
  114.                 os.system('giftopnm %s > %s' % (filename, tmpnam) )
  115.         elif type == 'ILBM':
  116.                 os.system('ilbmtoppm %s > %s' % (filename, tmpnam) )
  117.         else:
  118.                 os.system('convert %s %s' % (filename, tmpnam))
  119.  
  120.         return tmpnam
  121.  
  122. def scale_file(oldtmpnam):
  123.         fp = os.popen('pnmfile %s' % oldtmpnam)
  124.         info = string.split(fp.read())
  125.         fp.close()
  126.  
  127.         width = string.atoi(info[3])
  128.         height = string.atoi(info[5])
  129.  
  130.         if width <= WIDTH and height <= HEIGHT:
  131.                 debug_message('Not scaling %s: %d x %d' % (oldtmpnam, width,
  132.                                                            height))
  133.                 x = open(oldtmpnam)
  134.         else:
  135.                 debug_message('Scaling '+oldtmpnam)
  136.                 x = os.popen('pnmscale -xysize %d %d %s' % (WIDTH, HEIGHT,
  137.                                                             oldtmpnam))
  138.         return x
  139.  
  140. def clean_up_converted_file(tmpnam):
  141.         debug_message('Removing '+tmpnam)
  142.  
  143.         if not NOCLEANUP:
  144.                 os.unlink(tmpnam)
  145.  
  146. def show_file(filename, fp):
  147.         tmpfile = convert_file(filename)
  148.  
  149.         if tmpfile != '':
  150.                 x = scale_file(tmpfile)
  151.         else:
  152.                 x = scale_file(filename)
  153.  
  154.         txt = x.read()
  155.         if txt:
  156.                 fp.write(txt)
  157.                 fp.flush()
  158.         x.close()
  159.  
  160.         if tmpfile != '':
  161.                 clean_up_converted_file(tmpfile)
  162.  
  163. def main():
  164.         ret = 0
  165.  
  166.         tmpnam = '/tmp/agaview.%d.%d.ppm' % (time.time(), os.getpid())
  167.         
  168.         if len(sys.argv) < 2 or sys.argv[1] == '-h' or sys.argv[1] == '--help':
  169.                 print 'Usage: agaview [--grayscale] file1 [file2 ... filen]'
  170.                 sys.exit(1)
  171.         
  172.         if sys.argv[1] == "--grayscale" or sys.argv[1] == "-g":
  173.                 grayscale = 1
  174.                 start = 2
  175.         else:
  176.                 grayscale = 0
  177.                 start = 1
  178.         
  179.         if grayscale:
  180.                 fp = os.popen('ppmtoagafb -g %s -' % OPTIONS, 'w')
  181.         else:
  182.                 fp = os.popen('ppmtoagafb %s -' % OPTIONS, 'w')
  183.  
  184.         if not fp:
  185.                 print 'agaview: unable to open pipe to ppmtoagafb.'
  186.                 sys.exit(1)
  187.  
  188.  
  189.         for x in sys.argv[start:]:
  190.                 if os.path.exists(x):
  191.                         show_file(x, fp)
  192.                 else:
  193.                         print 'File does not exist:', x
  194.                         ret = 1
  195.         
  196.         fp.flush()
  197.         fp.close()
  198.  
  199.         if ret:
  200.                 print 'agaview: not completely successful'
  201.  
  202.         sys.exit(ret)
  203.  
  204. main()
  205.